// Tencent is pleased to support the open source community by making
// 蓝鲸智云 - 监控平台/日志平台 (BlueKing - Monitor/Log) available.
// Copyright (C) 2017-2022 THL A29 Limited, a Tencent company. All rights reserved.
// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at http://opensource.org/licenses/MIT
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
//

package receiver

import (
	"encoding/json"

	"github.com/TencentBlueKing/bkmonitor-kits/logger"
	"github.com/elastic/beats/libbeat/common/transport/tlscommon"

	"github.com/TencentBlueKing/bk-collector/define"
)

type Config struct {
	HttpServer      HttpServerConfig      `config:"http_server"`
	GrpcServer      GrpcServerConfig      `config:"grpc_server"`
	BenchmarkServer BenchmarkServerConfig `config:"benchmark_server"`
}

type HttpServerConfig struct {
	Enabled     bool                    `config:"enabled"`
	Endpoint    string                  `config:"endpoint"`
	Middlewares []string                `config:"middlewares"`
	TLS         *tlscommon.ServerConfig `config:"ssl"`
}

type GrpcServerConfig struct {
	Enabled   bool   `config:"enabled"`
	Endpoint  string `config:"endpoint"`
	Transport string `config:"transport"`
}

type BenchmarkServerConfig struct {
	Enabled bool                  `config:"enabled"`
	Traces  define.TracesOptions  `config:"traces"`
	Metrics define.MetricsOptions `config:"metrics"`
}

type OneApmInstanceConfig struct {
	Config map[string]interface{} `config:"config"`
}

func (c *OneApmInstanceConfig) Bytes() []byte {
	b, err := json.Marshal(c.Config)
	if err != nil {
		logger.Errorf("failed to marshal OneApmInstanceConfig: %v", err)
		return nil
	}
	return b
}

type OneApmInstanceIDConfig struct {
	Token  string               `config:"token"`
	Type   string               `config:"type"`
	ID     string               `config:"id"`
	OneApm OneApmInstanceConfig `config:"oneapm"`
}

type OneApmSubConfig struct {
	Type     string                   `config:"type"`
	Token    string                   `config:"token"`
	Default  *OneApmInstanceConfig    `config:"default"`
	Service  []OneApmInstanceIDConfig `config:"service"`
	Instance []OneApmInstanceIDConfig `config:"instance"`
}
